
namespace ShoppingCart.DataAccess
{
    using System;
    using System.Collections.Generic;
    using System.Data;
    using Business.Entity;
    using Business.Entity.Collections;
    using Microsoft.Practices.EnterpriseLibrary.Data;

	/// <summary>
	/// Represents the DataAccess of DetallePedidoData.
	/// </summary>
	public class DetallePedidoData : Singleton<DetallePedidoData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

		#region Methods

		/// <summary>
		/// Selects all records from the DetallePedido table by a foreign key.
		/// </summary>
		public DetallePedido Obtener(int idPedido, int idProducto)
		{
			var detallePedido = default(DetallePedido);
			var comando = BaseDatos.GetStoredProcCommand("SelectDetallePedido");

			BaseDatos.AddInParameter(comando, "IdPedido", DbType.Int32, idPedido);
			BaseDatos.AddInParameter(comando, "IdProducto", DbType.Int32, idProducto);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
                    detallePedido = new DetallePedido
                    {
                        Cantidad = lector.GetInt32(lector.GetOrdinal("Cantidad")),
                        Precio = lector.GetDecimal(lector.GetOrdinal("Precio")),
                        Descuento = lector.IsDBNull(lector.GetOrdinal("Descuento")) ? default(decimal) : lector.GetDecimal(lector.GetOrdinal("Descuento")),
                        Producto = ProductoData.Instancia.Obtener(idProducto),
                        Pedido = PedidoData.Instancia.Obtener(idPedido)
                    };
				}
			}
			comando.Dispose();
			return detallePedido;
		}

		/// <summary>
		/// Saves a record to the DetallePedido table.
		/// </summary>
		public int Agregar(DetallePedido detallePedido)
		{
			var comando = BaseDatos.GetStoredProcCommand("InsertDetallePedido");
			BaseDatos.AddInParameter(comando, "IdPedido", DbType.Int32, detallePedido.Pedido.IdPedido);
			BaseDatos.AddInParameter(comando, "IdProducto", DbType.Int32, detallePedido.Producto.IdProducto);
			BaseDatos.AddInParameter(comando, "Cantidad", DbType.Int32, detallePedido.Cantidad);
			BaseDatos.AddInParameter(comando, "Precio", DbType.Currency, detallePedido.Precio);
			BaseDatos.AddInParameter(comando, "Descuento", DbType.Decimal, detallePedido.Descuento);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Agregar DetallePedido.");

			comando.Dispose();
			return 1;
		}

		/// <summary>
		/// Updates a record in the DetallePedido table.
		/// </summary>
		public bool Modificar(DetallePedido detallePedido)
		{
			var comando = BaseDatos.GetStoredProcCommand("UpdateDetallePedido");
			BaseDatos.AddInParameter(comando, "IdPedido", DbType.Int32, detallePedido.Pedido.IdPedido);
			BaseDatos.AddInParameter(comando, "IdProducto", DbType.Int32, detallePedido.Producto.IdProducto);
			BaseDatos.AddInParameter(comando, "Cantidad", DbType.Int32, detallePedido.Cantidad);
			BaseDatos.AddInParameter(comando, "Precio", DbType.Currency, detallePedido.Precio);
			BaseDatos.AddInParameter(comando, "Descuento", DbType.Decimal, detallePedido.Descuento);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Modificar DetallePedido.");

			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the DetallePedido table by its primary key.
		/// </summary>
		public bool Eliminar(int idPedido, int idProducto)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDetallePedido");
			BaseDatos.AddInParameter(comando, "IdPedido", DbType.Int32, idPedido);
			BaseDatos.AddInParameter(comando, "IdProducto", DbType.Int32, idProducto);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar DetallePedido.");
			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the DetallePedido table by a foreign key.
		/// </summary>
		public void EliminarPorIdPedido(int idPedido)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDetallePedidoByIdPedido");
			BaseDatos.AddInParameter(comando, "IdPedido", DbType.Int32, idPedido);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar DetallePedido.");
			comando.Dispose();
		}

		/// <summary>
		/// Deletes a record from the DetallePedido table by a foreign key.
		/// </summary>
		public void EliminarPorIdProducto(int idProducto)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDetallePedidoByIdProducto");
			BaseDatos.AddInParameter(comando, "IdProducto", DbType.Int32, idProducto);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar DetallePedido.");
			comando.Dispose();
		}

		/// <summary>
		/// Selects all records from the DetallePedido table by a foreign key.
		/// </summary>
		public DetallePedidoCollection ListarPorIdPedido(int idPedido)
		{
			var entidades = new DetallePedidoCollection();
			var comando = BaseDatos.GetStoredProcCommand("SelectDetallePedidoByIdPedido");

			BaseDatos.AddInParameter(comando, "IdPedido", DbType.Int32, idPedido);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
                    entidades.Add(new DetallePedido
                    {
                        Cantidad = lector.GetInt32(lector.GetOrdinal("Cantidad")),
                        Precio = lector.GetDecimal(lector.GetOrdinal("Precio")),
                        Descuento = lector.IsDBNull(lector.GetOrdinal("Descuento")) ? default(decimal) : lector.GetDecimal(lector.GetOrdinal("Descuento")),
                        IdProducto = lector.GetInt32(lector.GetOrdinal("IdProducto")),
                        Producto = ProductoData.Instancia.Obtener(lector.GetInt32(lector.GetOrdinal("IdProducto")))
                    });
				}
			}
			comando.Dispose();
			return entidades;
		}

		/// <summary>
		/// Selects all records from the DetallePedido table by a foreign key.
		/// </summary>
		public IList<DetallePedido> ListarPorIdProducto(int idProducto)
		{
			var entidades = new List<DetallePedido>();
			var comando = BaseDatos.GetStoredProcCommand("SelectDetallePedidoByIdProducto");

			BaseDatos.AddInParameter(comando, "IdProducto", DbType.Int32, idProducto);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new DetallePedido
					{
						Cantidad = lector.GetInt32(lector.GetOrdinal("Cantidad")),
						Precio = lector.GetDecimal(lector.GetOrdinal("Precio")),
						Descuento = lector.IsDBNull(lector.GetOrdinal("Descuento"))? default(decimal) : lector.GetDecimal(lector.GetOrdinal("Descuento")),
                        Pedido = PedidoData.Instancia.Obtener(lector.GetInt32(lector.GetOrdinal("IdPedido")))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		#endregion
	}
}
